package com.axujie.tlgypt.service.utils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;

/**
 * 
 * @author XuJie
 * @Date 2016年7月30日
 * 描述：通过序列化的方式实现对象的深度拷贝
 * 		前提是对象实现了Serializable接口
 * 注意：List和Map都没有实现，只有它们的子类实现了
 */
public class DeepCloneUtils {
	@SuppressWarnings("unchecked")
	public static <T extends Serializable> T clone(T obj){
		T cloneObj = null;
		try{
			ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
			ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
			objectOutputStream.writeObject(obj);
			objectOutputStream.close();
			
			ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(byteArrayOutputStream.toByteArray());
			ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
			cloneObj = (T) objectInputStream.readObject();
			objectInputStream.close();
			
			byteArrayInputStream.close();
			byteArrayOutputStream.close();
			
		}catch(Exception e){
			e.printStackTrace();
		}
		return cloneObj;
	}
}
